<head>
    <meta charset="utf-8">
    <title>How to add new API？ - Answer Meta</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
    <meta name="theme-color" content="#0033FF">
    
    <meta name="generator" content="Answer 1.3.1 - https://github.com/apache/incubator-answer version 3a37588">
    
    

    <link rel="canonical" href="https://meta.answer.dev/questions/D1JI2/how-to-add-new-api">
    <link rel="manifest" href="/manifest.json">
    <link href="/static/css/main.5edb4c25.css" rel="stylesheet">
    <link href="/custom.css" rel="stylesheet">
    <link rel="icon" type="image/png" href="https://meta.answer.dev/uploads/branding/4J3ddi2rys5.png" data-rh="true">
    <link rel="icon" type="image/png" sizes="192x192" href="https://meta.answer.dev/uploads/branding/4J3cJNouy5q.png" data-rh="true">
    <link rel="apple-touch-icon" type="image/png" href="https://meta.answer.dev/uploads/branding/4J3cJNouy5q.png" data-rh="true">
    
    <script type="text/javascript" async="" src="//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js"></script><script defer="defer" src="/static/js/chunk-mix1.48bf3bda.chunk.js"></script>
    
    <script defer="defer" src="/static/js/chunk-mix2.e38b5d14.chunk.js"></script>
    
    <script defer="defer" src="/static/js/chunk-mix3.d2fa1986.chunk.js"></script>
    
    <script defer="defer" src="/static/js/codemirror.8cecf59d.js"></script>
    
    <script defer="defer" src="/static/js/lezer.0746330e.js"></script>
    
    <script defer="defer" src="/static/js/react-dom.1680fc0a.chunk.js"></script>
    
    <script defer="defer" src="/static/js/chunk-nodesInitial.440576c0.chunk.js"></script>
    
    <script defer="defer" src="/static/js/main.4fb41d09.js"></script>
    
    <script data-react-helmet="true" type="application/ld+json">{"@context":"https://schema.org","@type":"QAPage","mainEntity":{"@type":"Question","name":"How to add new API？","text":"\u003cp\u003eSorry for my English. I am interested in adding some new APIs and would appreciate guidance on how to achieve that. I remember previous documentation contained instructions on developing new APIs, however, it seems that the current ones do not.\u003c/p\u003e\n","answerCount":2,"upvoteCount":0,"dateCreated":"2024-02-23T13:54:12+08:00","author":{"@type":"Person","name":"karilito"},"acceptedAnswer":{"@type":"Answer","text":"\u003ch3 id=\"dependencies-between-packages\"\u003eDependencies between packages\u003c/h3\u003e\n\u003cp\u003eFor most api, the flow chart is very simple as follows.\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003erouter -\u0026gt; middleware -\u0026gt; controller(use schema) -\u0026gt; service -\u0026gt; repo(use entity)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf you want to develop a new API, you can follow the steps below.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eAdding a routing rule (GET/POST/PUT...) in router.\u003c/li\u003e\n\u003cli\u003eAdding a controller for handler requests. the request should be validated in the controller.\u003c/li\u003e\n\u003cli\u003eAdding a service to process business.\u003c/li\u003e\n\u003cli\u003eAdding a repo for saving or querying data from the database or cache.\u003c/li\u003e\n\u003cli\u003eRegenerate swagger documentation and test API.\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003cp\u003eI\u0026#39;ll add this original section to the documentation. You can also continue to ask us if you have any questions during the development process. :)\u003c/p\u003e\n","dateCreated":"2024-02-23T15:35:59+08:00","upvoteCount":1,"url":"https://meta.answer.dev/questions/D1JI2/how-to-add-new-api/E1RI2","author":{"@type":"Person","name":"LinkinStar"}},"suggestedAnswer":[{"@type":"Answer","text":"\u003cp\u003ethank you for the reply.\u003cbr\u003e\nbut i can see the doc here???\u003cbr\u003e\n\u003ca href=\"https://meta.answer.dev/swagger/index.html\"\u003ehttps://meta.answer.dev/swagger/index.html\u003c/a\u003e\u003c/p\u003e\n","dateCreated":"2024-04-08T16:50:14+08:00","upvoteCount":0,"url":"https://meta.answer.dev/questions/D1JI2/how-to-add-new-api/E1NL2","author":{"@type":"Person","name":"KALAWI"}}]}} </script>
  <link rel="stylesheet" type="text/css" href="/static/css/9070.20a4b7ab.chunk.css"><meta property="og:type" content="website" data-rh="true"><meta property="og:site_name" content="Answer Meta" data-rh="true"><meta property="og:url" content="https://meta.answer.dev/questions/D1JI2/how-to-add-new-api" data-rh="true"><meta property="og:image" itemprop="image primaryImageOfPage" content="https://meta.answer.dev/uploads/branding/4J3cJNouy5q.png" data-rh="true"><meta name="twitter:card" content="summary" data-rh="true"><meta name="twitter:domain" content="meta.answer.dev" data-rh="true"><meta name="twitter:image" content="https://meta.answer.dev/uploads/branding/4J3cJNouy5q.png" data-rh="true"><style data-rh="true">
              :root {
                --bs-blue: #0033FF;
                --bs-primary: #0033FF;
                --bs-primary-rgb: 0,51,255;
                --bs-link-color: #0033FF;
                --bs-link-color-rgb: 0,51,255;
                --bs-link-hover-color: #0029CC;
                --bs-link-hover-color-rgb: 0,41,204
              }
              :root[data-bs-theme='dark'] {
                --bs-link-color: #6685FF;
                --bs-link-color-rgb: 102,133,255;
                --bs-link-hover-color: #859DFF;
                --bs-link-hover-color-rgb: 133,157,255;
              }
              .nav-pills {
                --bs-nav-pills-link-active-bg: #0033FF;
              }
              .btn-primary {
                --bs-btn-bg: #0033FF;
                --bs-btn-border-color: #0033FF;
                --bs-btn-hover-bg: rgb(38, 82, 255);
                --bs-btn-hover-border-color: rgb(26, 71, 255);
                --bs-btn-focus-shadow-rgb: rgb(0, 43, 217);
                --bs-btn-active-bg: rgb(51, 92, 255);
                --bs-btn-active-border-color: rgb(26, 71, 255);
                --bs-btn-disabled-bg: #0033FF;
                --bs-btn-disabled-border-color: #0033FF;
              }
              .btn-outline-primary {
                --bs-btn-color: #0033FF;
                --bs-btn-border-color: #0033FF;
                --bs-btn-hover-bg: #0033FF;
                --bs-btn-hover-border-color: #0033FF;
                --bs-btn-active-bg: #0033FF;
                --bs-btn-active-border-color: #0033FF;
                --bs-btn-disabled-color: #0033FF;
                --bs-btn-disabled-border-color: #0033FF;
              }
              .pagination {
                --bs-btn-color: #0033FF;
                --bs-pagination-active-bg: #0033FF;
                --bs-pagination-active-border-color: #0033FF;
              }
              .form-select:focus,
              .form-control:focus,
               .form-control.focus{
                box-shadow: 0 0 0 0.25rem rgba(0, 51, 255, 0.25) !important;
                border-color: rgb(128, 153, 255) !important;
              }
              .form-check-input:checked {
                background-color: #0033FF;
                border-color: #0033FF;
              }
              .form-check-input:focus {
                border-color: rgb(128, 153, 255);
                box-shadow: 0 0 0 0.25rem rgba(var(--bs-primary-rgb), .4);
              }
              .form-switch .form-check-input:focus {
                background-image: url("data:image/svg+xml,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%27-4 -4 8 8%27%3e%3ccircle r=%273%27 fill=%27rgb(128, 153, 255)%27/%3e%3c/svg%3e");
              }
              .tag-selector-wrap--focus {
                box-shadow: 0 0 0 0.25rem rgba(0, 51, 255, 0.25) !important;
                border-color: rgb(128, 153, 255) !important;
              }
              .dropdown-menu {
                --bs-dropdown-link-active-bg: rgb(var(--bs-primary-rgb));
              }
              .link-primary {
                color: #0033FF!important;
              }
              .link-primary:hover, .link-primary:focus {
                color: #0029CC!important;
              }
              .badge-tag:not(.badge-tag-reserved, .badge-tag-required) {
                background-color: rgba(204,214.2,255, .5);
                color: #001F99
              }
              .badge-tag:not(.badge-tag-reserved, .badge-tag-required):hover {
                 background-color: #CCD6FF;
              }

              [data-bs-theme="dark"] .badge-tag:not(.badge-tag-reserved):not(.badge-tag-required) {
                background-color: rgba(0,10.200000000000001,51, .5) !important;
                color: #99ADFF !important;
              }
              [data-bs-theme="dark"] .badge-tag:not(.badge-tag-reserved, .badge-tag-required):hover {
                background-color: rgba(#99ADFF, 0.8) !important;
                color: #6685FF !important;
              }
            </style><link rel="stylesheet" type="text/css" href="/static/css/8868.06b7ad82.chunk.css"><meta name="keywords" content="support,api" data-rh="true"><meta name="description" content="Sorry for my English. I am interested in adding some new APIs and would appreciate guidance on how to achieve that. I remember previous documentation contained instructions on developing new APIs, however, it seems that the current ones do ..." data-rh="true"><meta property="og:title" name="twitter:title" content="How to add new API？ - Answer Meta" data-rh="true"><meta property="og:description" content="Sorry for my English. I am interested in adding some new APIs and would appreciate guidance on how to achieve that. I remember previous documentation contained instructions on developing new APIs, however, it seems that the current ones do ..." data-rh="true"><meta name="twitter:description" content="Sorry for my English. I am interested in adding some new APIs and would appreciate guidance on how to achieve that. I remember previous documentation contained instructions on developing new APIs, however, it seems that the current ones do ..." data-rh="true"></head>

  <body><!--customize_header--><!--customize_header-->
    <div id="root"><nav id="header" class="sticky-top theme-colored navbar navbar-expand-lg navbar-dark"><div class="d-flex align-items-center container"><button aria-controls="navBarContent" id="navBarToggle" type="button" aria-label="Toggle navigation" class="answer-navBar me-2 navbar-toggler collapsed"><span class="navbar-toggler-icon"></span></button><div class="d-flex justify-content-between align-items-center nav-grow flex-nowrap"><a class="lh-1 me-0 me-sm-5 p-0 navbar-brand" href="/"><img class="d-none d-lg-block logo me-0" src="https://meta.answer.dev/uploads/branding/4RUL5ghyogA.png" alt="Answer Meta"><img class="lg-none logo me-0" src="https://meta.answer.dev/uploads/branding/4RUL5ghyogA.png" alt="Answer Meta"></a><div class="d-flex lg-none align-items-center flex-lg-nowrap"><a role="button" tabindex="0" href="/users/login" class="me-2 link-light btn btn-link">Log in</a><a role="button" tabindex="0" href="/users/register" class="btn btn-light">Sign up</a></div></div><div class="me-auto navbar-collapse collapse" id="navBarContent"><hr class="hr lg-none mb-3" style="margin-top: 12px;"><div class="ps-0 col-lg-8"><form action="/search" class="w-100 maxw-400"><input placeholder="Search" name="q" type="search" class="placeholder-search form-control" value=""></form></div><div class="lg-none mt-3 pb-1 nav-item"><a class="text-capitalize text-nowrap btn btn-light" href="/questions/ask">Add question</a></div><div class="d-none d-lg-flex justify-content-start justify-content-sm-end col-lg-4"><a role="button" tabindex="0" href="/users/login" class="me-2 link-light btn btn-link">Log in</a><a role="button" tabindex="0" href="/users/register" class="btn btn-light">Sign up</a></div></div></div></nav><div class="position-relative page-wrap d-flex flex-column flex-fill"><div class="d-flex flex-column flex-fill container"><div class="flex-fill row"><div id="sideNav" class="position-relative d-none d-lg-block col-xl-2 col-lg-3 col-md-12"><div class="nav-wrap pt-4"><div class="flex-column nav nav-pills"><a aria-current="page" class="nav-link active" href="/questions"><i class="br bi-question-circle-fill me-2"></i><span>Questions</span></a><a href="/tags" data-rr-ui-event-key="/tags" class="nav-link"><i class="br bi-tags-fill me-2"></i><span>Tags</span></a><a class="nav-link" href="/users"><i class="br bi-people-fill me-2"></i><span>Users</span></a><div class="py-2 px-3 mt-3 small fw-bold quick-link">Quick Links</div>
   <a class="nav-link" href="/tags/discussion">
     discussion
   </a>
   <a class="nav-link" href="/tags/support">
     support
   </a>
   <a class="nav-link" href="/tags/feature-request">
     feature-request
   </a>
   <a class="nav-link" href="/tags/bug">
     bug
   </a></div></div><div class="side-nav-right-line"></div></div><div class="col-xl-10 col-lg-9 col-md-12"><div class="questionDetailPage pt-4 mb-5 row"><div class="page-main flex-auto col"><div><h1 class="h3 mb-3 text-wrap text-break"><a class="link-dark" href="/questions/D1JI2/how-to-add-new-api">How to add new API？</a></h1><div class="d-flex flex-wrap align-items-center small mb-3 text-secondary"><time class="me-3" datetime="2024-02-23T05:54:12.000Z" title="Feb 22, 2024 at 21:54">Asked Feb 22</time><time class="me-3" datetime="2024-04-08T08:50:14.000Z" title="Apr 8, 2024 at 01:50">Modified Apr 8</time><div class="me-3">Viewed 121</div><button type="button" class="p-0 btn-no-border btn btn-link btn-sm">Follow</button></div><div class="m-n1"><a class="badge-tag rounded-1 badge-tag-required m-1" href="/tags/support"><span class="">support</span></a><a class="badge-tag rounded-1 m-1" href="/tags/api"><span class="">api</span></a></div><div class="img-viewer"><article class="fmt text-break text-wrap mt-4"><p>Sorry for my English. I am interested in adding some new APIs and would appreciate guidance on how to achieve that. I remember previous documentation contained instructions on developing new APIs, however, it seems that the current ones do not.</p>
</article></div><div class="mt-4"><div role="group" class="btn-group"><button type="button" title="It is useful and clear" class="btn btn-outline-secondary"><i class="br bi-hand-thumbs-up-fill"></i></button><button type="button" disabled="" class="opacity-100 btn btn-outline-secondary">0</button><button type="button" title="It is unclear or not useful" class="btn btn-outline-secondary"><i class="br bi-hand-thumbs-down-fill"></i></button></div><button type="button" title="Bookmark this question" class="btn btn-outline-secondary ms-3"><i class="br bi-bookmark-fill"></i><span style="padding-left: 10px;">0</span></button></div><div class="d-block d-md-flex flex-wrap mt-4 mb-3"><div class="mb-3 mb-md-0 me-4 flex-grow-1"><div class="d-flex align-items-center"><div class="dropdown"><a class="no-toggle small link-secondary pointer d-flex dropdown-toggle" id="dropdown-share" aria-expanded="false" style="line-height: 23px;">Share</a></div></div></div><div class="mb-3 me-4 mb-md-0" style="min-width: 196px;"><div class="d-flex"><a href="/users/fenbox"><img src="https://www.gravatar.com/avatar/58aaa5cddd80929a44905b50acf471b1?s=96&amp;d=identicon" width="40px" height="40px" class="rounded me-2 d-none d-md-block" alt="Fen"><img src="https://www.gravatar.com/avatar/58aaa5cddd80929a44905b50acf471b1?s=48&amp;d=identicon" width="24px" height="24px" class="rounded me-2 d-block d-md-none" alt="Fen"></a><div class="small text-secondary d-flex flex-row flex-md-column align-items-center align-items-md-start"><div class="me-1 me-md-0 d-flex align-items-center"><a class="me-1 text-break name-ellipsis" href="/users/fenbox" style="max-width: 100px;">Fen</a><span class="fw-bold" title="Reputation">435</span></div><time class="" datetime="2024-03-01T02:40:57.000Z" title="Feb 29, 2024 at 18:40">edited Feb 29</time></div></div></div><div style="min-width: 196px;"><div class="d-flex"><a href="/users/karilito"><img src="https://meta.answer.dev/uploads/avatar/4Q49oV9BLRw.jpg?s=96" width="40px" height="40px" class="rounded me-2 d-none d-md-block" alt="karilito"><img src="https://meta.answer.dev/uploads/avatar/4Q49oV9BLRw.jpg?s=48" width="24px" height="24px" class="rounded me-2 d-block d-md-none" alt="karilito"></a><div class="small text-secondary d-flex flex-row flex-md-column align-items-center align-items-md-start"><div class="me-1 me-md-0 d-flex align-items-center"><a class="me-1 text-break name-ellipsis" href="/users/karilito" style="max-width: 100px;">karilito</a><span class="fw-bold" title="Reputation">43</span></div><time class="" datetime="2024-02-23T05:54:12.000Z" title="Feb 22, 2024 at 21:54">asked Feb 22</time></div></div></div></div><div class="comments-wrap"><div class=""><button type="button" class="p-0 btn-no-border btn btn-link btn-sm">Add comment</button></div></div></div><div class="d-flex align-items-center justify-content-between mt-5 mb-3" id="answerHeader"><h5 class="mb-0">2 Answers</h5><div role="group" class="btn-group btn-group-sm"><a role="button" tabindex="0" href="?order=default" class="text-capitalize fit-content btn active btn-outline-secondary">Score</a><a role="button" tabindex="0" href="?order=updated" class="text-capitalize fit-content btn btn-outline-secondary">Newest</a><a role="button" tabindex="0" href="?order=created" class="text-capitalize fit-content btn btn-outline-secondary">Oldest</a></div></div><div id="E1RI2" class="answer-item py-4"><div class="mb-3 lh-1"><span class="badge rounded-pill bg-success"><i class="br bi-check-circle-fill me-1"></i>Best answer</span></div><div class="img-viewer"><article class="fmt text-break text-wrap"><h3 id="dependencies-between-packages">Dependencies between packages</h3>
<p>For most api, the flow chart is very simple as follows.</p>
<pre><code>router -&gt; middleware -&gt; controller(use schema) -&gt; service -&gt; repo(use entity)
</code></pre>
<p>If you want to develop a new API, you can follow the steps below.</p>
<ol>
<li>Adding a routing rule (GET/POST/PUT...) in router.</li>
<li>Adding a controller for handler requests. the request should be validated in the controller.</li>
<li>Adding a service to process business.</li>
<li>Adding a repo for saving or querying data from the database or cache.</li>
<li>Regenerate swagger documentation and test API.</li>
</ol>
<hr>
<p>I'll add this original section to the documentation. You can also continue to ask us if you have any questions during the development process. :)</p>
</article></div><div class="d-flex align-items-center mt-4"><div class=""><div role="group" class="btn-group"><button type="button" title="It is useful" class="btn btn-outline-secondary"><i class="br bi-hand-thumbs-up-fill"></i></button><button type="button" disabled="" class="opacity-100 btn btn-outline-secondary">1</button><button type="button" title="It is not useful" class="btn btn-outline-secondary"><i class="br bi-hand-thumbs-down-fill"></i></button></div></div></div><div class="d-block d-md-flex flex-wrap mt-4 mb-3"><div class="mb-3 mb-md-0 me-4 flex-grow-1"><div class="d-flex align-items-center"><div class="dropdown"><a class="no-toggle small link-secondary pointer d-flex dropdown-toggle" id="dropdown-share" aria-expanded="false" style="line-height: 23px;">Share</a></div></div></div><div class="mb-3 mb-md-0 me-4" style="min-width: 196px;"></div><div style="min-width: 196px;"><div class="d-flex"><a href="/users/linkinstar"><img src="https://meta.answer.dev/uploads/avatar/4Lv9TTyCnKf.jpg?s=96" width="40px" height="40px" class="rounded me-2 d-none d-md-block" alt="LinkinStar"><img src="https://meta.answer.dev/uploads/avatar/4Lv9TTyCnKf.jpg?s=48" width="24px" height="24px" class="rounded me-2 d-block d-md-none" alt="LinkinStar"></a><div class="small text-secondary d-flex flex-row flex-md-column align-items-center align-items-md-start"><div class="me-1 me-md-0 d-flex align-items-center"><a class="me-1 text-break name-ellipsis" href="/users/linkinstar" style="max-width: 100px;">LinkinStar</a><span class="fw-bold" title="Reputation">1,136</span></div><time class="" datetime="2024-02-23T07:35:59.000Z" title="Feb 22, 2024 at 23:35">answered Feb 22</time></div></div></div></div><div class="comments-wrap bg-light px-3 py-2 rounded"><div id="10070000000010370" class="py-2 comment-item"><div class="d-block"><div class="fmt small text-break text-wrap"><p>Thanks very much</p>
</div></div><div class="d-flex justify-content-between flex-wrap small"><div class="d-flex align-items-center flex-wrap link-secondary"><a class="name-ellipsis" href="/users/karilito" style="max-width: 200px;">karilito</a><span class="mx-1">•</span><time class="me-3 flex-shrink-0" datetime="2024-02-23T07:41:28.000Z" title="Feb 22, 2024 at 23:41">Feb 22</time><button type="button" title="It adds something useful to the post" class="flex-shrink-0 me-3 btn-no-border p-0 link-secondary btn btn-link btn-sm"><i class="br bi-hand-thumbs-up-fill"></i></button><button type="button" class="link-secondary m-0 p-0 btn-no-border btn btn-link btn-sm">Reply</button></div><div class="align-items-center control-area d-none"></div><div class="d-block d-md-none dropdown"><div class="no-toggle dropdown-toggle" id="dropdown-comment" aria-expanded="false" variant="success"><i class="br bi-three-dots text-secondary"></i></div></div></div></div><div class="py-2"><button type="button" class="p-0 btn-no-border btn btn-link btn-sm">Add comment</button></div></div></div><div id="E1NL2" class="answer-item py-4"><div class="img-viewer"><article class="fmt text-break text-wrap"><p>thank you for the reply.<br>
but i can see the doc here???<br>
<a href="https://meta.answer.dev/swagger/index.html">https://meta.answer.dev/swagger/index.html</a></p>
</article></div><div class="d-flex align-items-center mt-4"><div class=""><div role="group" class="btn-group"><button type="button" title="It is useful" class="btn btn-outline-secondary"><i class="br bi-hand-thumbs-up-fill"></i></button><button type="button" disabled="" class="opacity-100 btn btn-outline-secondary">0</button><button type="button" title="It is not useful" class="btn btn-outline-secondary"><i class="br bi-hand-thumbs-down-fill"></i></button></div></div></div><div class="d-block d-md-flex flex-wrap mt-4 mb-3"><div class="mb-3 mb-md-0 me-4 flex-grow-1"><div class="d-flex align-items-center"><div class="dropdown"><a class="no-toggle small link-secondary pointer d-flex dropdown-toggle" id="dropdown-share" aria-expanded="false" style="line-height: 23px;">Share</a></div></div></div><div class="mb-3 mb-md-0 me-4" style="min-width: 196px;"></div><div style="min-width: 196px;"><div class="d-flex"><a href="/users/kalawi"><img src="https://www.gravatar.com/avatar/b24fa8935def2bc97001dd70e136fe61?s=96&amp;d=identicon" width="40px" height="40px" class="rounded me-2 d-none d-md-block" alt="KALAWI"><img src="https://www.gravatar.com/avatar/b24fa8935def2bc97001dd70e136fe61?s=48&amp;d=identicon" width="24px" height="24px" class="rounded me-2 d-block d-md-none" alt="KALAWI"></a><div class="small text-secondary d-flex flex-row flex-md-column align-items-center align-items-md-start"><div class="me-1 me-md-0 d-flex align-items-center"><a class="me-1 text-break name-ellipsis" href="/users/kalawi" style="max-width: 100px;">KALAWI</a><span class="fw-bold" title="Reputation">3</span></div><time class="" datetime="2024-04-08T08:50:14.000Z" title="Apr 8, 2024 at 01:50">answered Apr 8</time></div></div></div></div><div class="comments-wrap bg-light px-3 py-2 rounded"><div id="10070000000010555" class="py-2 comment-item"><div class="d-block"><div class="fmt small text-break text-wrap"><p>Sorry, I don't know much about Swagger, but I remember that Swagger is used for API testing, which means testing whether the interface functions are working properly. It does not require an API key. Before testing, Answer need be running.</p>
</div></div><div class="d-flex justify-content-between flex-wrap small"><div class="d-flex align-items-center flex-wrap link-secondary"><a class="name-ellipsis" href="/users/karilito" style="max-width: 200px;">karilito</a><span class="mx-1">•</span><time class="me-3 flex-shrink-0" datetime="2024-04-08T09:00:49.000Z" title="Apr 8, 2024 at 02:00">Apr 8</time><button type="button" title="It adds something useful to the post" class="flex-shrink-0 me-3 btn-no-border p-0 link-secondary btn btn-link btn-sm"><i class="br bi-hand-thumbs-up-fill"></i></button><button type="button" class="link-secondary m-0 p-0 btn-no-border btn btn-link btn-sm">Reply</button></div><div class="align-items-center control-area d-none"></div><div class="d-block d-md-none dropdown"><div class="no-toggle dropdown-toggle" id="dropdown-comment" aria-expanded="false" variant="success"><i class="br bi-three-dots text-secondary"></i></div></div></div></div><div class="py-2"><button type="button" class="p-0 btn-no-border btn btn-link btn-sm">Add comment</button></div></div></div><form novalidate="" class="mt-4"><div class="mb-3"><label class="form-label"><h5>Your Answer</h5></label><input class="d-none form-control"><div class="d-flex"><textarea rows="8" class="w-100 form-control"></textarea></div><div class="invalid-feedback"></div></div><button type="button" class="btn btn-primary">Post your answer</button></form></div><div class="page-right-side mt-4 mt-xl-0 col"><div class="invite-answer-card position-relative border-0 mb-4 card"><div class="text-nowrap d-flex justify-content-between text-capitalize card-header">Invite People</div><div class="position-relative card-body"><div class="d-flex align-items-center flex-wrap m-n1"><a class="mx-2 my-1 d-inline-flex flex-nowrap" href="/users/linkinstar"><img src="https://meta.answer.dev/uploads/avatar/4Lv9TTyCnKf.jpg?" width="24" height="24" class="rounded-1" alt="LinkinStar"><small class="ms-2">LinkinStar</small></a></div></div></div><div class="card"><div class="card-header">Related Questions</div><div class="list-group list-group-flush"><a class="list-group-item list-group-item-action" href="/questions/D193/how-to-configure-nginx-to-work-with-answer-on-docker"><div class="link-dark">How to configure nginx to work with answer on docker?</div><div class="mt-1 small me-2 link-success"><i class="br bi-check-circle-fill me-1"></i><span>2 answers</span></div></a><a class="list-group-item list-group-item-action" href="/questions/D1Oa/how-to-fully-backup-answer-dev-and-restore-it"><div class="link-dark">How to fully backup answer.dev and restore it?</div><div class="mt-1 small me-2 link-success"><i class="br bi-check-circle-fill me-1"></i><span>1 answers</span></div></a><a class="list-group-item list-group-item-action" href="/questions/D1G3/how-to-configure-ssl"><div class="link-dark">How to configure SSL?</div><div class="mt-1 small me-2 link-secondary"><i class="br bi-chat-square-text-fill me-1"></i><span>1 answers</span></div></a><a class="list-group-item list-group-item-action" href="/questions/D1v3/how-to-modify-footer-sections"><div class="link-dark">how to modify footer sections?</div><div class="mt-1 small me-2 link-secondary"><i class="br bi-chat-square-text-fill me-1"></i><span>2 answers</span></div></a><a class="list-group-item list-group-item-action" href="/questions/D1l2/there-is-also-a-problem-with-the-smtp-mailbox"><div class="link-dark">There is also a problem with the smtp mailbox</div><div class="mt-1 small me-2 link-secondary"><i class="br bi-chat-square-text-fill me-1"></i><span>1 answers</span></div></a><a class="list-group-item list-group-item-action" href="/questions/D1y2/why-editor-toolbar-icons-cannot-be-displayed"><div class="link-dark">Why editor toolbar icons cannot be displayed</div><div class="mt-1 small me-2 link-success"><i class="br bi-check-circle-fill me-1"></i><span>1 answers</span></div></a></div></div></div></div></div></div></div><div style="position: fixed; top: 90px; left: 50%; transform: translate(-50%, 0px); max-width: 100%; z-index: 1001;"><div class="d-flex justify-content-center"></div></div></div><div class="d-flex justify-content-center" style="position: fixed; top: 90px; left: 0px; right: 0px; margin: auto; z-index: 5;"></div><footer class="bg-light"><div class="py-3 container"><p class="text-center mb-0 small text-secondary">Powered by <a href="https://answer.apache.org" target="_blank"> Apache Answer </a>- the open-source software that powers Q&amp;A communities.<br>Made with love © 2024 Answer Meta.</p></div></footer></div>



<!--customize_footer--><script>(() => {
      
(() => {
  const obNode = document.querySelector('#root');
  const obConfig = { attributes: false, childList: true, subtree: true };
 
  const obCallback = () => {
   if (location.pathname.indexOf('/questions/ask') === -1) {
     return;
   }
   const el = document.querySelector('.pt-4.mb-5');
   if (!el) {
     return;
   }
   if (el.firstChild.nodeType !== 1 || el.firstChild.nodeName.toLowerCase() !=='div' || el.textContent.indexOf('这里有全球的志愿者，使用英文提问能更快获得帮助') === -1) {
     el.insertAdjacentHTML('afterBegin', '<div class="mb-3 text-danger">这里有全球的志愿者，使用英文提问能更快获得帮助</div>');
   }
  }

  if (/zh/.test(navigator.language)) {
    const mob = new MutationObserver(obCallback);
    mob.observe(obNode, obConfig);
  }
 })();

    })();</script>


<script>(() => {
      
  const htmlstr = `<div class="py-2 px-3 mt-3 small fw-bold quick-link">Quick Links</div>
   <a class="nav-link" href="/tags/discussion">
     discussion
   </a>
   <a class="nav-link" href="/tags/support">
     support
   </a>
   <a class="nav-link" href="/tags/feature-request">
     feature-request
   </a>
   <a class="nav-link" href="/tags/bug">
     bug
   </a>`;

  window.onload = function () {
    const navUser = document.querySelector('#sideNav a[href="/users"]');
    const navQuick = document.querySelector("#sideNav .quick-link");
    if (navUser && !navQuick) {
      navUser.insertAdjacentHTML("afterend", htmlstr);
    }
  };
  const timer = setInterval(() => {
    const navUser = document.querySelector('#sideNav a[href="/users"]');
    const navQuick = document.querySelector("#sideNav .quick-link");
    if (navUser && !navQuick) {
      navUser.insertAdjacentHTML("afterend", htmlstr);
    }

    const links = document.querySelectorAll('#sideNav a[href^="/tags/"]');
    links.forEach((link) => {
      const href = link.getAttribute("href");
      const currentPathname = window.location.pathname;
      if (href === currentPathname) {
        link.classList.add("active");
      } else {
        link.classList.remove("active");
      }
    });
  }, 500);

  window.addEventListener("beforeunload", function (event) {
    clearInterval(timer);
  });

    })();</script>

<script type="text/javascript" async="">(() => {
      
(function (f, b) { if (!b.__SV) { var e, g, i, h; window.mixpanel = b; b._i = []; b.init = function (e, f, c) { function g(a, d) { var b = d.split("."); 2 == b.length && ((a = a[b[0]]), (d = b[1])); a[d] = function () { a.push([d].concat(Array.prototype.slice.call(arguments, 0))); }; } var a = b; "undefined" !== typeof c ? (a = b[c] = []) : (c = "mixpanel"); a.people = a.people || []; a.toString = function (a) { var d = "mixpanel"; "mixpanel" !== c && (d += "." + c); a || (d += " (stub)"); return d; }; a.people.toString = function () { return a.toString(1) + ".people (stub)"; }; i = "disable time_event track track_pageview track_links track_forms track_with_groups add_group set_group remove_group register register_once alias unregister identify name_tag set_config reset opt_in_tracking opt_out_tracking has_opted_in_tracking has_opted_out_tracking clear_opt_in_out_tracking start_batch_senders people.set people.set_once people.unset people.increment people.append people.union people.track_charge people.clear_charges people.delete_user people.remove".split( " "); for (h = 0; h < i.length; h++) g(a, i[h]); var j = "set set_once union unset remove delete".split(" "); a.get_group = function () { function b(c) { d[c] = function () { call2_args = arguments; call2 = [c].concat(Array.prototype.slice.call(call2_args, 0)); a.push([e, call2]); }; } for ( var d = {}, e = ["get_group"].concat( Array.prototype.slice.call(arguments, 0)), c = 0; c < j.length; c++) b(j[c]); return d; }; b._i.push([e, f, c]); }; b.__SV = 1.2; e = f.createElement("script"); e.type = "text/javascript"; e.async = !0; e.src = "undefined" !== typeof MIXPANEL_CUSTOM_LIB_URL ? MIXPANEL_CUSTOM_LIB_URL : "file:" === f.location.protocol && "//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js".match(/^\/\//) ? "https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js" : "//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js"; g = f.getElementsByTagName("script")[0]; g.parentNode.insertBefore(e, g); } })(document, window.mixpanel || []);

    })();</script>

<script type="text/javascript">(() => {
      
  setTimeout(() => {
      window.mixpanel.init('8eab86fc70cb24662718f37915ed8dde', {
        track_pageview: true,
      });
   }, 1000);

    })();</script><!--customize_footer--></body>